home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PCMania 53
/
PCMania CD53_1.iso
/
pcmania
/
virus53
/
buscaexe.c
next >
Wrap
C/C++ Source or Header
|
1997-01-18
|
15KB
|
442 lines
/*----------------------------------------------*/
/* BUSCAEXE (c) 1997 Por Javier Guerrero Díaz
/* Busca en la memoria, boot de disketes
/* y MBR del disco duro el virus ANTIEXE.
/* La sintaxis es: BUSCAEXE <unidad>.
/* Programado con Borland C++ 5.01
/*----------------------------------------------*/
/* Javier Guerrero Díaz */
/* */
/* 'jgd@redestb.es' */
/*-------------------------------*/
#include <stdio.h>
#include <dos.h>
#include <dir.h>
#include <conio.h>
#include <bios.h>
#include <stdlib.h>
#include <direct.h>
#include <string.h>
void intro(void);
void buscamem(void);
void busca(void);
void leeboot(void);
void errorhand(int);
void buscaenboot(void);
void mensaje(char *mensa);
void matavir(void);
void panta(void);
void fin(void);
void mal(void);
int far *direcc;
char far *memo;
char tecla,flag,unidad,cambio,buffer[512],letra;
char cadena[]={ 0x33,0xFF,0x8E,0xDF,0xC4,0x16,0x4C,0x00,0x89,0x16,0x4C,
0x03,0x8C,0x06,0x4E,0x03,0xFA,0x8E,0xD7,0xBE,0x00,0x7C,
0x8B,0xE6,0xFB };
int segmento,despl,pulsa,temp;
void main(argc,argv)
int argc;
char *argv[];
{
letra=*argv[1];
if (*argv[1]=='a' || *argv[1]=='A') unidad=0;
else if (*argv[1]=='b' || *argv[1]=='B') unidad=1;
else if (*argv[1]=='c' || *argv[1]=='C') unidad=0x80;
else if (*argv[1]=='d' || *argv[1]=='D') unidad=0x81;
else { printf("\nBUSCAEXE (c)1997 Por Javier Guerrero Díaz\n");
printf("Sintaxis: BUSCAEXE <unidad>\n"); exit(-1); }
setcbrk(1);
_setcursortype(_NOCURSOR);
intro();
panta();
buscamem();
leeboot();
buscaenboot();
}
void matavir(void)
{
short resultado1;
int resultado2,cx,ax;
char head,sector;
if (unidad==0 || unidad==1)
{
memo=&buffer[4]; cx=*memo; sector=cx;
memo=&buffer[6]; head=*memo;
}
else { sector=0x0D; head=0; }
textattr(LIGHTGRAY|BLACK<<4); clrscr(); panta();
window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
cprintf(" ");
gotoxy(24,23); cprintf("Leyendo boot original ..."); sleep(1);
gotoxy(24,23);
cprintf(" ");
asm mov ah,0
asm mov dl,byte ptr unidad
asm int 13h
resultado1=_AH;
if (resultado1 !=0) errorhand(resultado1);
asm mov ah,15h
asm mov dl,byte ptr unidad
asm int 13h
asm mov byte ptr cambio,ah
asm mov ah,2
asm mov dl,byte ptr unidad
asm mov dh,byte ptr head
asm mov ch,0
asm mov cl,byte ptr sector
asm mov al,1
asm mov es,segmento
asm mov bx,despl
asm int 13h
asm mov resultado2,ax
if (unidad==0 && resultado2 !=0x0001)
errorhand(resultado2);
else if (unidad==1 && resultado2 !=0x0001)
errorhand(resultado2);
else if (unidad==0x80 && resultado2!=0)
errorhand(resultado2);
else if (unidad==0x81 && resultado2!=0)
errorhand(resultado2);
window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
cprintf(" ");
gotoxy(24,23); cprintf("Restaurando boot original ..."); sleep(1);
gotoxy(24,23);
cprintf(" ");
asm mov ah,3
asm mov dl,byte ptr unidad
asm mov dh,0
asm mov ch,0
asm mov cl,1
asm mov al,1
asm mov es,segmento
asm mov bx,despl
asm int 13h
asm mov resultado2,ax
if (unidad==0 && resultado2 !=0x0001)
errorhand(resultado2);
else if (unidad==1 && resultado2 !=0x0001)
errorhand(resultado2);
else if (unidad==0x80 && resultado2!=0)
errorhand(resultado2);
else if (unidad==0x81 && resultado2!=0)
errorhand(resultado2);
window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
cprintf(" ");
gotoxy(24,23); cprintf("OK. Virus ANTIEXE eliminado."); sleep(1);
gotoxy(24,23);
cprintf(" ");
}
void buscaenboot(void)
{
memo=&buffer[0x117];
for (temp=0;temp<sizeof cadena;temp++)
{
if (*memo!=cadena[temp]) goto noinfec;
else memo++;
}
window(17,7,63,15); textattr(WHITE|RED<<4); putch(7);
cprintf("╔═════════════════════════════════════════════╗");
cprintf("║ Atención: Se encontró la marca de infección ║");
cprintf("║ propia del virus ANTIEXE en el boot sector ║");
cprintf("║ de la unidad %c: . ║",letra);
cprintf("║ Esta unidad se encuentra infectada por ║");
cprintf("║ el virus. Pulse 'SUPR' para eliminarlo ║");
cprintf("║ o cualquier tecla para analizar otro disco. ║");
cprintf("╚═════════════════════════════════════════════╝");
mensaje("¡ Sector de arranque infectado !");
pulsa=bioskey(0);
switch (pulsa)
{
case 283: fin();
break;
case 0x5300: matavir();
goto tecl;
case 0x532E: matavir();
goto tecl;
default: goto tecl;
}
noinfec: if (flag==1) { window(17,7,63,19);
cprintf("╔═════════════════════════════════════════════╗");
cprintf("║ Aviso: No se ha encontrado la marca de ║");
cprintf("║ infección del virus ANTIEXE. Aunque esta ║");
cprintf("║ unidad no esté infectada, si en el chequeo ║");
cprintf("║ de memoria previo se detectó una disminu- ║");
cprintf("║ ción en la cantidad de memoria convencional ║");
cprintf("║ es posible que algún otro virus, como por ║");
cprintf("║ ejemplo, el RIPPER, se encuentre residente. ║");
cprintf("║ Se recomienda chequear con otros detectores.║");
cprintf("║ ║");
cprintf("║ Pulse una tecla para analizar otro disco. ║");
cprintf("╚═════════════════════════════════════════════╝");
mensaje("Disco limpio. Se recomienda chequeo."); goto press;
}
else window(17,7,63,15); textattr(WHITE|CYAN<<4);
cprintf("╔═════════════════════════════════════════════╗");
cprintf("║ OK! El sector de arranque de la unidad %c: ║",letra);
cprintf("║ no se encuentra infectado por el virus ║");
cprintf("║ ANTIEXE. Esta unidad está limpia. ║");
cprintf("║ Pulse una tecla para comprobar otro disco ║");
cprintf("║ o vuelva a ejecutar BUSCAEXE para chequear ║");
cprintf("║ una unidad de disco diferente a la actual. ║");
cprintf("╚═════════════════════════════════════════════╝");
window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
cprintf(" ");
gotoxy(24,23); cprintf("OK. Disco limpio.");
sleep(1); gotoxy(24,23);
cprintf(" ");
press: pulsa=bioskey(0);
tecl: switch (pulsa)
{
case 283: fin();
default: panta();
leeboot();
buscaenboot();
}
}
void leeboot(void)
{
short resultado1;
int resultado2;
segmento=FP_SEG(buffer); despl=FP_OFF(buffer);
direcc=(char far *)MK_FP(segmento,despl);
window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
cprintf(" ");
gotoxy(24,23); cprintf("Leyendo boot..."); sleep(1);
gotoxy(24,23);
cprintf(" ");
asm mov ah,0
asm mov dl,byte ptr unidad
asm int 13h
resultado1=_AH;
if (resultado1 !=0) errorhand(resultado1);
asm mov ah,15h
asm mov dl,byte ptr unidad
asm int 13h
asm mov byte ptr cambio,ah
asm mov ah,2
asm mov dl,byte ptr unidad
asm mov dh,0
asm mov ch,0
asm mov cl,1
asm mov al,1
asm mov es,segmento
asm mov bx,despl
asm int 13h
asm mov resultado2,ax
if (unidad==0 && resultado2 !=0x0001)
errorhand(resultado2);
else if (unidad==1 && resultado2 !=0x0001)
errorhand(resultado2);
else if (unidad==0x80 && resultado2!=0)
errorhand(resultado2);
else if (unidad==0x81 && resultado2!=0)
errorhand(resultado2);
}
void buscamem(void)
{
window(18,7,62,11);
textattr(WHITE|BLUE<<4);
cprintf("╔═══════════════════════════════════════════╗");
cprintf("║ Atención: Buscando virus ANTIEXE en RAM. ║");
cprintf("║ Analizando la memoria .... ║");
cprintf("╚═══════════════════════════════════════════╝");
sleep(1);
busca();
}
void busca(void)
{
char far *cop;
char dummy;
direcc=(int far *)MK_FP(0x0000,0x0413);
if (*direcc<0x280)
{
window(17,7,63,15); textattr(YELLOW|RED<<4); putch(7); flag=1;
cprintf("╔═════════════════════════════════════════════╗");
cprintf("║ Atención: La cantidad de memoria conven- ║");
cprintf("║ cional en el sistema es inferior a 640 Kb; ║");
cprintf("║ como otros muchos virus, el ANTIEXE produ- ║");
cprintf("║ ce este efecto. Se realizará un analisis ║");
cprintf("║ de la memoria para determinar la existencia ║");
cprintf("║ en la misma del virus ANTIEXE. ║");
cprintf("╚═════════════════════════════════════════════╝");
mensaje("Encontrado síntoma de infección vírica."); sleep(5);
textattr(LIGHTGRAY|BLACK<<4); clrscr(); panta();
}
else goto noresid;
segmento=*direcc*64; despl=0x117;
memo=(char far *)MK_FP(segmento,despl);
cop=(char far *)MK_FP(segmento,0);
for (temp=0;temp<sizeof cadena;temp++)
{
if (*memo!=cadena[temp]) goto noresid;
else memo++;
}
flag=2; window(14,7,66,21); textattr(YELLOW|RED<<4);
putch(7);
cprintf("╔═══════════════════════════════════════════════════╗");
cprintf("║ Atención: Virus ANTIEXE detectado en la ║");
cprintf("║ dirección de memoria : %X:0000 ║",segmento);
cprintf("╟───────────────────────────────────────────────────╢");
cprintf("║ ║");
cprintf("║ ║");
cprintf("║ ║");
cprintf("║ ║");
cprintf("║ ║");
cprintf("║ ║");
cprintf("║ ║");
cprintf("║ ║");
cprintf("║ ║");
cprintf("╚═══════════════════════════════════════════════════╝");
window(15,11,65,20); textattr(WHITE|RED<<4);
for (temp=0;temp<459;temp++)
{ dummy=*cop; if (dummy<32) dummy='.'; cprintf("%c",dummy); cop++; }
mensaje("¡ Virus encontrado en memoria !"); textattr(LIGHTGRAY|BLACK<<4);
sleep(5); clrscr(); panta();
window(17,7,63,15);
cprintf("╔═════════════════════════════════════════════╗");
cprintf("║ Aviso: El virus se encuentra en memoria. ║");
cprintf("║ Aunque el programa continuará su ejecucion, ║");
cprintf("║la infección NO SERA DETECTADA. Arranque con ║");
cprintf("║ un S.O. limpio y ejecute de nuevo BUSCAEXE. ║");
cprintf("║ ║");
cprintf("║ ║");
cprintf("╚═════════════════════════════════════════════╝");
window(23,13,62,13); textattr(YELLOW|BLUE<<4);
cprintf("Analizando boot de unidad %c: .....",letra); sleep(2);
leeboot(); buscaenboot();
noresid:
window(18,7,62,11);
cprintf("╔═══════════════════════════════════════════╗");
cprintf("║ OK !. No se encontró el virus en RAM. ║");
cprintf("║ Analizando boot de unidad %c: .... ║",letra);
cprintf("╚═══════════════════════════════════════════╝");
}
void intro(void)
{
clrscr(); gotoxy(20,9); textattr(YELLOW|BLUE<<4);
cprintf("╔═════════════════════════════════════╗\n"); gotoxy(20,10);
cprintf("║ BUSCAEXE ║\n"); gotoxy(20,11);
cprintf("║ (c) 1997 Por Javier Guerrero Diaz. ║\n"); gotoxy(20,12);
cprintf("║ Rastrea el sector de arranque de la ║\n"); gotoxy(20,13);
cprintf("║ unidad especificada como parámetro ║\n"); gotoxy(20,14);
cprintf("║ en busca del virus ANTIEXE. ║\n"); gotoxy(20,15);
cprintf("╚═════════════════════════════════════╝\n");
textattr(LIGHTGRAY|BLACK<<4);tecla=getch();
clrscr();
}
void fin(void)
{
window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
cprintf(" ");
gotoxy(24,23); cprintf("PROGRAMA FINALIZADO.");
_setcursortype(_NORMALCURSOR); textattr(LIGHTGRAY|BLACK<<4);
gotoxy(24,1);
exit(0);
}
void mal(void)
{
window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
cprintf(" ");
gotoxy(24,23); cprintf("PROGRAMA FINALIZADO ANORMALMENTE.");
_setcursortype(_NORMALCURSOR); textattr(LIGHTGRAY|BLACK<<4);
gotoxy(24,1);
exit(-1);
}
void errorhand(numerror)
int numerror;
{
switch(numerror)
{
case 0x0100: mensaje("Error: Función no permitida.");
break;
case 0x0200: mensaje("Error: Marca de direcciones no encontrada.");
break;
case 0x0300: mensaje("Error: Disquete protegido contra escritura.");
break;
case 0x0400: mensaje("Error: Sector no encontrado.");
break;
case 0x0600:
if (cambio!=2)
{ mensaje("Error: Disco retirado, pulsa tecla para repetir lectura.");
getch(); }
leeboot(); buscaenboot();
break;
case 0x0800: mensaje("Error: Desbordamiento de DMA.");
break;
case 0x0900: cprintf("Error: Superado el límite de 64k de segmento.");
break;
case 0x0c00: mensaje("Error: Tipo de entorno no hallado.");
break;
case 0x1000: mensaje("Error: Fallo de lectura.");
break;
case 0x2000: mensaje("Error: Fallo de controladora de disco.");
break;
case 0x4000: mensaje("Error: Pista no encontrada.");
break;
case 0x8000: mensaje("Error: Time Out; unidad no responde.");
break;
default: mensaje("Error: Fallo general.");
break;
}
mal();
}
void mensaje(mensa)
char mensa[50];
{
window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
cprintf(" ");
gotoxy(24,23); cprintf("%s",mensa); putch(7);
sleep(1); gotoxy(24,23);
cprintf(" ");
}
void panta(void)
{
window(20,2,60,7);
gotoxy(1,1);
textattr(YELLOW|BLUE<<4);
cprintf("╔═══════════════════════════════════════╗");
cprintf("║ BUSCAEXE: DETECTOR DEL VIRUS ANTIEXE ║");
cprintf("║ (C) Por Javier Guerrero Diaz ║");
cprintf("╚═══════════════════════════════════════╝");
window(1,22,80,25);
cprintf("╔══════════════════════════════════════════════════════════════════════════════╗");
cprintf("║ RESULTADO OPERACION: ║");
cprintf("╚══════════════════════════════════════════════════════════════════════════════╝");
textattr(WHITE|BLUE<<4); window(1,1,80,25);
}